﻿
//本文档是C++11内容的理解和练习 

#include <iostream>
#include <vector>
#include <map>
#include <set>
using namespace std;



class Date
{
public:

	
	Date(int year = 2025 , int month = 1 , int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
	{
		cout << "Date 全缺省 --- 构造函数" << endl;
	}

	
	Date(const Date& d)
		:_year(d._year)
		, _month(d._month)
		, _day(d._day)
	{
		cout << "Date  --- 拷贝构造函数" << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

struct Point
{
	int _x;
	int _y;
};


//列表初始化 /  初始化列表
void Test01()
{

	////////////////////////  列表初始化 

	// C++11 后引入列表初始化 ------- 一切皆可列表初始化

	// 0.  C++98已经支持
	int a[] = { 1,2,3,4,5 };
	Point p = { 1,2 }; // 初始化结构体

	//C++11 
	// 1. 内置类型列表初始化
	int b = { 2 }; // b = 2

	//自定义类型的初始化

	//2. 这里是构造 + 拷贝构造 -- 编译器会优化直接优化为 ---- 直接构造
	Date d1 = { 2025,2,15 }; // 本质也是多参数构造函数支持隐式类型转换
	//以上的本质是 :{ 2025,2,15 }产生了 Date 的临时对象 , 临时对象拷贝给 d1
	 
	
	//3. 这里是会产生临时对象 , d2 引用的临时对象 , 临时对象具有常性 , 所以用 const
	//const Date& d2 = {2025,2,15};
	//	
	////4. 列表初始化
	//map<int,int> mp;
	//mp.insert({ 1,2 });

	////列表初始化可以省略 = 
	//int b1{ 2 };
	//Date d31{ 2025 };
	//Point p1{ 2,2 };
	//set<int> s1{ 1,2,3,4 };

	

	////////////////////////  初始化列表

	// 注意: 列表初始化与初始化列表不同

	//初始化列表是构造函数中的 , 用在容器里 , initializer_list 是一个类
	set<int> s = { 1,2,3,4,5,6,7,8,9 };  // initializer_list
	//这里是  { 1,2,3,4,5,6,7,8,9 } --- initializer_list 传给这个类 , 之后再进行过构造


}


//左值和右值
// 左值可以取地址 ,是占用空间的
// 右值不可以取地址 , 有临时对象等 , 不占用空间

void Test02()
{
	// 区分二者的区别就是  ---- 是否可以取地址  !!!!!!!!!!!!!!!!
	// 1. 左值  ---- 可以取地址 , 可以出现在赋值符号左右
	// 2. 右值  ---- 不可取地址 , 一般具有常性 , 不能出现在赋值符号的左边

	int x = 0, y = 0 , z = 0;
	z = x + y;

	// 左值：可以取地址
	// 以下的p、b、c、*p、s、s[0]就是常⻅的左值
	int* p = new int(0);
	int b = 1;
	const int c = b;
	*p = 10;
	string s("111111");
	s[0] = 'x';

	cout << &c << endl;
	cout << (void*)&s[0] << endl;


}


int main()
{
	//列表初始化和初始化列表
	Test01();

	return 0;
}



/// 总结
#if 0
a.一切皆可列表初始化(C++11), 这个统一了标准

b.**** 区分 : 列表初始化和初始化列表 * ***
		1.列表初始化一切皆可
			eg :
				map<int,int> v;
				v.insert({1,1})  // 这是一个列表初始化
		2. 初始化列表 --- 是容器中有的 , 本质还是构造 
			             只不过通过一个 initializer_list 的类进行的
											|
										这个类在构造函数中,所以容器用初始化列表就很方便
					eg :

				map<int, int> v = { {1,1} , {2,2} };
				// 这是初始化列表 --- 走的是构造

#endif